/** ==================================================================================== **/
/** 							Definizione dell'internalizzazione   					 **/
/** ==================================================================================== **/


/**
 * Inizializzazione del plugin per l'internalizzazione, lettura dal file di properties delle label.
 *  
 * Path : bundle/
 * 
 * Esempi d'uso:
 * 	
 * 	 1. <div translate>Loader.default</div>
 *   
 *   2. <h1 translate="Loader.default"></h1>
 *   
 *   3. <h1>{{ 'load.static.HEADER' | translate }}</h1>
 *    
 *   4. <div translate-namespace="ns1">
 *    	  <h1 translate>.HEADER</h1>
 *        <h2 translate>.SUBHEADER</h2>
 *      </div>
 *      
 *   5. 
 *	  "DATA_TO_FILTER"	  : "Your translations might also contain any static ({{staticValue}}) or random ({{randomValue}}) values"  
 *	  "DATA_TO_DIRECTIVE" : "And it's no matter if ... {{staticValue}} and random is still {{randomValue}}."
 *   
 *    $scope.tlData = {
 *    		staticValue : 42,
 *  	  	randomValue : Math.floor(Math.random() * 1000)
 *    };
 *    
 *    Passing a data object to the translation by the filter 
 *    <p>{{'DATA_TO_FILTER' | translate: tlData}}</p>
 *   
 *    Passing a data object to the translation by the directive 
 *    <p translate="DATA_TO_DIRECTIVE" translate-values="{{tlData}}"></p>
 *    
 *   6.
 *    "RAW_TO_FILTER"     : "In case you want to pass a {{type}} data to the filter .."
 *    "RAW_TO_DIRECTIVE"  : "This trick also works for {{type}} with a small mods."
 *   
 *    Passing a raw data to the filter
 *    <p>{{'RAW_TO_FILTER' | translate:'{ type: "raw" }' }}</p>
 *     
 *    Passing a raw data to the filter
 *    <p translate="RAW_TO_DIRECTIVE" translate-values="{ type: 'directives' }"></p>
 *    
 *   7. Lato javascript:
 *      Es label:
 *       {
 *        "TRANSLATION_ID": "{{username}} is logged in."
 *       }
 *      Es traduzione:
 *       $translate('TRANSLATION_ID');
 *       $translate('TRANSLATION_ID', { 'username': 'PascalPrecht' });
 *       $translate('TRANSLATION_ID', { 'username': 'PascalPrecht', 'lastLogin': '2013-07-21 6:50PM'});
 *       
 *       $translate.instant('TRANSLATION_ID');
 *       $translate.instant('TRANSLATION_ID', { 'username': 'PascalPrecht' });
 *       $translate.instant('TRANSLATION_ID', { 'username': 'PascalPrecht', 'lastLogin': '2013-07-21 6:50PM'});
 */
BootApplication.config(['$translateProvider', function($translateProvider) {
	
	/** 
	 * Funzione per il recupero delle label da un file di properties stile "java" 
	 * I file di properties devono contenere le label nel formato "chiave = valore"
	 */
	var splitProperties = function(lines) {
		var result = {};
		for(var i = 0; i < lines.length; i++) {
			if(lines[i]) {
				var token = lines[i].split("=");
				var tk = 0;
				var key = token[tk++];
				if(key.indexOf("#") == -1) {
					var value = token[tk++];
					for(; tk < token.length; tk++) {
						value += "=" + token[tk];
					}
					value = value.replace("\n", "").replace("\r", "");
					result[key] = value;
				}
			}
		}
		return result;
	};
  
  /** 
   * Registra un loader per i file statici quindi, il modulo file sotto gli URL specificati. 
   * Tali URL sono [prefix] [langKey] [suffix].
   */
  $translateProvider.useStaticFilesLoader({
     prefix: Constants.ContextPath + 'bundle/Messages_',
     suffix: '.properties',
     $http: {
       transformResponse: function (data, headersGetter, status) {
    	   return splitProperties(data.split('\n'));
       }
     }
  });
  
  /** language to use by default **/
  $translateProvider.preferredLanguage(Constants.DEFAULT_LANGUAGE);
  
  /** store the language in the cookie **/
  $translateProvider.useCookieStorage();
  
  /**
   * sanitizes HTML in the values of the interpolation parameters using $sanitize
   */
  $translateProvider.useSanitizeValueStrategy("sanitizeParameters");
  
  /**
   * Definisco un custom handler per gestire il caso i cui non viene trovata la chiave da tradurre.
   */
  $translateProvider.useMissingTranslationHandler('customTranslationHandler');
  
}]);

/**
 * In caso di errore dovuto al fatto che non è stata trovata la chiave da tradurre utilizzo un testo di sostituzione di default.
 * Fornisco un testo di sostituzione di default (non chiave) per il front-end in modo che i traduttori possono vedere quale sia la 
 * chiave mancante. 
 */
BootApplication.factory('customTranslationHandler', function ( $log ) {
	return function (translationID, uses) {
		$log.warn("Error translationId -->> " + translationID + " : NON TROVATA ")
	    
		return 'DEFAULT KEY';
	};
});
